package cn.biplam.common.wrapper.treeFlat.flat;

import java.util.ArrayList;

import cn.biplam.common.wrapper.treeFlat.PcNode;
import cn.biplam.common.wrapper.treeFlat.flat.callback.OperatorTypeFilterCallback;
import cn.biplam.common.wrapper.treeFlat.flat.callback.ParentFieldNameCallback;
import cn.biplam.common.wrapper.treeFlat.flat.callback.ParentFieldNameCallbackDefault;

/**
 *  平面数据输出
 * @author XiaoRuxing Nov 28, 200911:39:14 AM
 * @version 1.0
 */
public class FlatOut {

	/** 记录ID字段名 */
	protected String nodeIdField;
	/** 节点名称字段名 */
	protected String nodeNameField;
	/** 业务级别字段名 */
	protected String nodeLevelField;
	/** 操作类型字段名 */
	protected String operatorTypeFieldName;
	/** 父亲字段名称 */
	protected String parentFieldName;
	/** 获取父亲们字段名称的回调器 */
	protected ParentFieldNameCallback parentFieldNameCallback;
	
	/** 当前数据的字段列表 */
	protected ArrayList<String> fieldNameList;
	/** 当前父亲们字段列表 */
	protected ArrayList<String> parentFieldNameList;
	/** 当前父亲们名称字段列表 */
	protected ArrayList<String> parentNameFieldNameList;
	/** 当前父亲们逻辑名称列表 */
	protected ArrayList<String> parentCnNameFieldNameList;
	
	protected TreeFlat treeFlat;
	
	/**
	 *  创建平面化数据
	 * @param data 平面化数据
	 */
	public FlatOut(PcNode data) {
		this.treeFlat = new TreeFlat(data);
	}

	/**
	 *  设置父亲们字段名称回调器<BR>
	 *  生成每个父亲的ID和名称字段名
	 * @param parentFieldNameCallback 父亲们字段名称回调器
	 */
	public void setParentFieldNameCallback(
			ParentFieldNameCallback parentFieldNameCallback){
		this.parentFieldNameCallback = parentFieldNameCallback;
	}

	/**
	 *  设置节点ID字段名称
	 * @param nodeIdField 节点ID字段名称
	 */
	public void setNodeIdField(String nodeIdField) {
		this.nodeIdField = nodeIdField;
	}

	/**
	 *  设置节点名称字段名
	 * @param nodeNameField 节点名称字段名
	 */
	public void setNodeNameField(String nodeNameField) {
		this.nodeNameField = nodeNameField;
	}

	/**
	 *  设置节点级别字段名
	 * @param nodeLevelField 节点级别字段名
	 */
	public void setNodeLevelField(String nodeLevelField) {
		this.nodeLevelField = nodeLevelField;
	}

	/**
	 *  设置节点父亲字段名
	 * @param parentFieldName 节点父亲字段名
	 */
	public void setParentFieldName(String parentFieldName) {
		this.parentFieldName = parentFieldName;
	}
	
	/**
	 *  设置节点操作类型字段名称
	 * @param operatorTypeFieldName 节点操作类型字段
	 */
	public void setOperatorTypeFieldName(String operatorTypeFieldName){
		this.operatorTypeFieldName = operatorTypeFieldName;
	}
	
	/**
	 * @return 父亲们字段列表
	 */
	public ArrayList<String> getParentFieldNameList() {
		return parentFieldNameList;
	}
	
	/**
	 * @return 父亲们字段列表
	 */
	public ArrayList<String> getParentFieldCnNameList() {
		return this.parentCnNameFieldNameList;
	}
	
	/**
	 * @return 父亲们名称字段列表
	 */
	public ArrayList<String> getParentNameFieldNameList() {
		return parentNameFieldNameList;
	}
	
	/**
	 *  
	 * @return 获取字段名列表
	 */
	public ArrayList<String> fieldNameList(){
		return this.fieldNameList;
	}
	
	/**
	 *  设置节点操作类型过滤回调器
	 */
	public void setOperatorTypeFilterCallback(OperatorTypeFilterCallback callback){
		this.treeFlat.setOperatorTypeFilterCallback(callback);
	}
	
	/**
	 *  生成字段列表
	 */
	protected void getFieldNameList(){
		if(this.fieldNameList==null){
			fieldNameList = new ArrayList<String>();
			fieldNameList.add(this.nodeIdField);
			fieldNameList.add(this.nodeNameField);
			fieldNameList.add(this.nodeLevelField);
			fieldNameList.add(this.operatorTypeFieldName);
			//父亲们字段名称
			if(this.parentFieldNameCallback == null){
				this.parentFieldNameCallback = new ParentFieldNameCallbackDefault();//如果未设置父亲们字段名称回调器设置默认父亲名称回调器
			}
			this.parentFieldNameList = this.parentFieldNameCallback.getParentFieldNames(this.treeFlat.getDepth(), 
					parentFieldName);
			this.parentNameFieldNameList = this.parentFieldNameCallback.getParentNameFieldNames(this.treeFlat.getDepth(), 
					parentFieldName);
			this.parentCnNameFieldNameList = this.parentFieldNameCallback.getParentCnNameFieldNames(this.treeFlat.getDepth(),
					parentFieldName);
			fieldNameList.addAll(parentFieldNameList);
			fieldNameList.addAll(parentNameFieldNameList);
		}
	}
}
